#ifndef CONTROLEUR_H
#define CONTROLEUR_H

#include<string>
#include<QString>
#include<QStandardItem>
#include<QList>
#include<QStringList>
#include<iostream>
#include<QDate>
#include"./modele/enseignant.h"
#include"./modele/etudiant.h"
#include"./modele/salle.h"
#include"./modele/salleCM.h"
#include"./modele/salleTD.h"
#include"./modele/salleTP.h"
#include"./modele/module.h"
#include"./modele/groupe.h"
#include"./modele/creneau.h"

class Controleur
{
public:

    Controleur();

    void ajouterEtudiant(QString idetu, QString nometu, QString prenometu, QString adresseetu, QString mailetu);
    void ajouterEnseignant(QString idens, QString nomens, QString prenomens, QString adresseens, QString mailens);
    void ajouterSalleCM(QString nums, QString capacite, const bool& b);
    void ajouterSalleTD(QString nums, QString capacite, const bool& b);
    void ajouterSalleTP(QString nums, QString capacite, QString nbmachines);
    void ajouterModule(QString idmod, QString titre, QString heurecm, QString heuretd, QString heuretp, Enseignant* resp);
    void ajouterGroupe(QString nomgrp);
    void ajouterGroupe(QString nomgrp, EnsEtu ense, EnsMod suivi);
    void ajouterCreneau(QDate* date, int heure, Salle* salle, Groupe* groupe, Module* module);

    void ModifierEtudiant(QString idetu, QString nometu, QString prenometu, QString adresseetu, QString mailetu);
    void ModifierEnseignant(QString idens, QString nomens, QString prenomens, QString adresseens, QString mailens);
    void ModifierSalleCM(QString noSalle, QString capacite, const bool& b);
    void ModifierSalleTD(QString noSalle, QString capacite, const bool& b);
    void ModifierSalleTP(QString noSalle, QString capacite, QString nbm);

    void SupprimerEtudiant(QString idetu);
    void SupprimerEnseignant(QString idens);
    void SupprimerSalleCM(QString idsalle);
    void SupprimerSalleTD(QString idsalle);
    void SupprimerSalleTP(QString idsalle);
    void SupprimerModule(QString idmodule);
    void SupprimerGroupe(QString nomgroupe);


    EnsembleEns getEnseignants();
    EnsembleEtu getEtudiants();
    EnsembleSCM getSallesCM();
    EnsembleSTD getSallesTD();
    EnsembleSTP getSallesTP();
    EnsembleMod getModules();
    EnsembleGrp getGroupes();
    EnsembleCre getCreneaux();
    EnsembleCre *getCreneaux(QDate date);

    void refreshTreeViewEns(QStandardItemModel* model);
    void refreshTreeViewEtu(QStandardItemModel* model);
    void refreshTreeViewSalle(QStandardItemModel* model);
    void refreshTreeViewMod(QStandardItemModel* model);
    void refreshTreeViewGrp(QStandardItemModel* model);
    void refreshTreeViewCre(QStandardItemModel *model);


    void getListEns(QStringList* listEns);
    void getListSalle(QStringList* listSalle);
    void getListModule(QStringList* listMod);
    void getListGroupe(QStringList* listgrp);

    Enseignant* getEnseignant(const int& index);

    Etudiant* getEtudiant(const std::string &str);
    Enseignant* getEnseignant(const std::string &str);
    SalleCM* getSalleCM(const int &i);
    SalleTD* getSalleTD(const int &i);
    SalleTP* getSalleTP(const int &i);
    Module* getModule(const int &i);
    Groupe* getGroupe(const std::string &str);


private:

    void refreshTreeViewSCM(QStandardItem* fItem);
    void refreshTreeViewSTD(QStandardItem *fItem);
    void refreshTreeViewSTP(QStandardItem* fItem);

    EnsembleEns enseignants_;
    EnsembleEtu etudiants_;
    EnsembleSCM sallescm_;
    EnsembleSTD sallestd_;
    EnsembleSTP sallestp_;
    EnsembleMod modules_;
    EnsembleGrp groupes_;
    EnsembleCre creneaux_;
};

std::ostream& operator<<(std::ostream& os, Controleur& c);

#endif // CONTROLEUR_H
